using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
using Estructuras.Estructura;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaComponerDatos
{
    public class ConsolaComponerDatos
    {
        static int Main(string[] args)
        {
            try
            {
                Console.Error.WriteLine(Constantes.MensajeComponente + CComponerDatos.NodoRaiz);
                Console.Error.WriteLine(Constantes.MensajeInicio + DateTime.Now.ToLocalTime());
                if (args.Length != 1)
                    throw new Excepcion(Constantes.ERROR_NUMERO_PARAMETROS_ENTRADA, Constantes.CODIGO_ERROR_NUMERO_PARAMETROS_ENTRADA);

                PComponerDatos propiedades = new PComponerDatos();
                propiedades.leer(args[0]);

                ObtenerElementos elementos = new ObtenerElementos();

                // Obtiene el origen de los datos
                TextReader entrada = elementos.ObtenerOrigenDatos(propiedades.Entrada);

                // Obtiene el destino de los datos
                TextWriter salida = elementos.ObtenerDestinoDatos(propiedades.Salida);

                XmlReader xsl = null;
                try
                {
                    XmlReaderSettings xmlRS = new XmlReaderSettings();
                    xsl = XmlReader.Create(propiedades.FicheroXSL, xmlRS);
                }
                catch (Exception)
                {
                    throw new Excepcion(Constantes.ERROR_CARGAR_FICHERO_XSL, Constantes.CODIGO_ERROR_CARGAR_FICHERO_XSL);
                }

                try
                {
                    Estructuras.Funciones.Componer.Componer.ComponerDatos(entrada, salida, xsl);
                }
                catch (Excepcion ex)
                {
                    throw new Excepcion(Constantes.ERROR_EJECUCION + ex.Message, ex, ex.Codigo);
                }
                catch (Exception ex)
                {
                    throw new Excepcion(Constantes.ERROR_EJECUCION + ex.Message, ex, Constantes.CODIGO_ERROR_EJECUCION);
                }

                // Cierra los ficheros de entrada y salida
                elementos.CerrarOrigenDatos(entrada);
                elementos.CerrarDestinoDatos(salida);
                Console.Error.WriteLine(Constantes.MensajeFin + DateTime.Now.ToLocalTime());
                return Constantes.EJECUCION_OK;
            }
            catch (Excepcion ex)
            {
                Console.Error.WriteLine(ex.Message);
                return ex.Codigo;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
                return Constantes.EJECUCION_ERROR;
            }
        }
    }
}
